#/*++
#
#Copyright (c) 2006, Intel Corporation                                                         
#All rights reserved. This program and the accompanying materials                          
#are licensed and made available under the terms and conditions of the BSD License         
#which accompanies this distribution.  The full text of the license may be found at        
#http://opensource.org/licenses/bsd-license.php                                            
#                                                                                          
#THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
#WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
#
#Module Name:
#
#   MultU64x32.c
#
#Abstract:
#
#  64-bit Multiplication function for IA-32
#
#--*/
#include "EfiBind.h"
#---------------------------------------------------------------------------
    .686: 
    #.MODEL flat,C
    .code: 

#---------------------------------------------------------------------------
.globl ASM_PFX(MultU64x32)
#UINT64
#MultU64x32 (
#  IN UINT64   Multiplicand,
#  IN UINTN    Multiplier
#  )
#/*++
#
#Routine Description:
#
#  This routine allows a 64 bit value to be multiplied with a 32 bit 
#  value returns 64bit result.
#  No checking if the result is greater than 64bits
#
#Arguments:
#
#  Multiplicand  - multiplicand
#  Multiplier    - multiplier
#
#Returns:
#
#  Multiplicand * Multiplier
#
#--*/
ASM_PFX(MultU64x32):

    movl   4(%esp), %eax # dword ptr Multiplicand[0]
    mull   0xC(%esp)             # Multiplier
    pushl  %eax
    pushl  %edx
    movl   0x10(%esp), %eax # dword ptr Multiplicand[4]
    mull   0x14(%esp)           # Multiplier
    #
    # The value in edx stored by second multiplication overflows
    # the output and should be discarded. So here we overwrite it
    # with the edx value of first multiplication.
    #
    popl   %edx
    addl   %eax, %edx
    popl   %eax

    ret
#MultU64x32 ENDP

